<!-- 问题列表 -->

<template>
  <div class="QuestionnaireList-MyQuestion flex full">
    <LeftType class="flex0 full" />

    <WebForm path="question" labelPosition="top" class="flex1 full">
      <EasyScroll full>
        <draggable
          v-model="one.questionList"
          :animation="200"
          group="question"
          :disabled="isShow"
          @start="MAP.inDrag = true"
          @end="MAP.inDrag = false"
        >
          <div v-for="(item, i) in one.questionList" :key="item.key">
            <div
              v-if="!hideMap[i]"
              :id="`QuestionnaireList-MyQuestion-no-${item.no}`"
              class="QuestionnaireList-MyQuestion-item flex"
              :class="{ 'QuestionnaireList-MyQuestion-item-hover': item.no === MAP.hoverNo }"
              @mouseenter="toEnter(item)"
              @mouseleave="toLeave(item)"
            >
              <FormSlot flex0>{{ item.no }}.</FormSlot>
              <component :is="CORE.keyPre(item.type, 'My')" :obj="item" :index="i" />
            </div>
          </div>

          <el-empty v-if="!one.questionList.length" description="暂无问题" />
        </draggable>
      </EasyScroll>
    </WebForm>

    <RightNav class="percent10 full" />
  </div>
</template>

<script>
// ============================== 导入依赖 ============================== //

import CORE from '@/CORE'

// ============================== 导出组件 ============================== //

export default {
  /**
   * 名称定义 (实际使用名称)
   */
  name: 'MyQuestion',

  /**
   * 混入列表 (配置选项合并)
   */
  mixins: [CORE.mixWeb(), CORE.mixModal('question', 'question_')],

  /**
   * 组件导入 (Abc.vue + Abc/index.vue)
   */
  ...CORE.components(require.context('./', true, /vue$/)),

  /**
   * 状态数据 (函数返回对象)
   */
  data() {
    return {
      hideMap: {}, // 是否隐藏的映射 (为 true 时隐藏)
    }
  },

  /**
   * 监听属性 (深度 deep 首次 immediate)
   */
  watch: {
    /**
     * 监听问题列表
     */
    'one.questionList'() {
      this.resetNo()
    },

    /**
     * 监听单项
     */
    one: {
      immediate: true,
      handler() {
        this.resetHideMap()
      },
    },

    /**
     * 监听弹窗类型
     */
    modal: {
      immediate: true,
      handler(modal) {
        this.question_setModal(modal)
      },
    },
  },

  /**
   * 本地方法 (轻量重要在前)
   */
  methods: {
    /**
     * 鼠标进入
     */
    toEnter(item) {
      const { MAP } = this
      if (!MAP.inDrag) {
        MAP.hoverNo = item.no

        const nav = document.getElementById(`QuestionnaireList-MyQuestion-nav-${item.no}`)
        nav.scrollIntoView({ behavior: 'smooth', block: 'center' })
      }
    },

    /**
     * 鼠标离开
     */
    toLeave() {
      const { MAP } = this
      if (!MAP.inDrag) MAP.hoverNo = 0
    },

    /**
     * 重置题号
     */
    resetNo() {
      this.one.questionList.forEach((question, i) => {
        if (question.no !== i + 1) question.no = i + 1
      })
    },

    /**
     * 重置是否隐藏的映射
     */
    resetHideMap() {
      const len = Math.ceil(this.one.questionList.length / 10) * 10
      Array(len).fill().forEach((_, i) => this.$set(this.hideMap, i, i > 9))

      if (len <= 10) return

      // 循环设置显示标志，以防一次性渲染的卡顿
      CORE.loading()
      let index = 0
      const timer = setInterval(() => {
        if (index < len) {
          for (let i = 0; i < 10; i++) this.hideMap[index + i] = false
          index += 10
        } else {
          clearInterval(timer)
          CORE.unloading()
        }
      }, 10)
    },
  },
}
</script>

<style lang="scss">
@import './index.scss';
</style>
